package cn.biplam.front.template.base;

import cn.biplam.common.tools.TOOLS;
import cn.biplam.common.wrapper.ErrorMessage;
import cn.biplam.front.html.HtmlDiv;
import cn.biplam.front.html.HtmlImage;
import cn.biplam.front.html.HtmlText;
import cn.biplam.front.html.base.HtmlWindow;
import cn.biplam.front.html.base.Const.Clear_Type;
import cn.biplam.front.html.base.Const.Float_Type;
import cn.biplam.front.html.base.Const.Visibility_Mode;
import cn.biplam.front.html.base.Const.Window_Event;
import cn.biplam.front.template.Template;

/**
 * 单选框组件。
 * 可以用ID、文本说明、单选框的排列样式(横排和竖排)来初始化复选框。
 * 复选框取值时：用"单选框name+value"的命名方式取值。单选框的选中值是一个字符串，
 * 值与值之间用","分割.
 * @author 	WangSong
 * @create 	2009-5-5 上午09:25:10
 * @version 1.0
 */
public class Radio implements Template{


	public enum Layout_Type {
		/**横排*/
		Horizontal,
		/**竖排 */
		Vertical;
	}

	private String name;
	private String ID;
	private String text;
	private String sHomeUrl;
	private Layout_Type type;
	private HtmlDiv mRadio;
	private boolean checked;
	private boolean readOnly;
	private final String imgCheck = "/images/radio.gif";
	private final String imgUnCheck = "/images/unradio.gif";
	private final String imgReadOnlyCheck = "/images/radio2.gif";
	private final String imgReadOnlyUnCheck = "/images/unradio2.gif";
	/** 选中时图片容器ID */
	private String checkID;
	/** 不选中时图片容器ID */
	private String unCheckedID;

	/**
	 * 构造方法  传入对象的页面ID和文本初始化
	 * @param name			单选框的名字
	 * @param keyID 单选框所代表对象ID(选择值)
	 * @param sHomeUrl	应用系统路径
	 * @throws ErrorMessage 
	 */
	public Radio(String name,String keyID,String sHomeUrl) throws ErrorMessage{
		this(name,keyID,sHomeUrl,"");
	}

	/**
	 * 构造方法
	 * @param name			单选框的名字
	 * @param keyID 		单选框所代表对象ID(选择值)
	 * @param sHomeUrl		应用系统路径
	 * @param text 			单选框所代表对象的说明
	 * @throws ErrorMessage
	 */
	public Radio(String name,String keyID,String sHomeUrl,String text) throws ErrorMessage{
		this(name,keyID,sHomeUrl,text,Layout_Type.Horizontal);
	}

	/**
	 * 构造方法
	 * @param name			单选框的名字
	 * @param keyID 		单选框所代表对象ID(选择值)
	 * @param sHomeUrl		应用系统路径
	 * @param text 			单选框所代表对象的说明
	 * @param isChecked 	是否选中
	 * @throws ErrorMessage
	 */
	public Radio(String name,String keyID,String sHomeUrl,String text,boolean isChecked) throws ErrorMessage{
		this(name,keyID,sHomeUrl,text,Layout_Type.Horizontal,
				isChecked,false);
	}
	
	/**
	 * 构造方法		传入对象的页面ID和文本初始化
	 * @param name			单选框的名字
	 * @param keyID 		单选框所代表对象ID(选择值)
	 * @param sHomeUrl		应用系统路径
	 * @param text 			单选框所代表对象的说明
	 * @param type			排版类型
	 * @throws ErrorMessage 
	 */
	public Radio(String name,String keyID,String sHomeUrl,String text,Layout_Type type) throws ErrorMessage{
		this(name,keyID,sHomeUrl,text,type,false,false);
	}
	
	/**
	 * 构造方法		传入对象的页面ID和文本初始化
	 * @param name			单选框的名字
	 * @param keyID 		单选框所代表对象ID(选择值)
	 * @param sHomeUrl		应用系统路径
	 * @param text 			单选框所代表对象的说明
	 * @param type 			排版类型
	 * @param checked  		是否被选中
	 * @param readOnly 		是否只读
	 * @throws ErrorMessage 
	 */
	public Radio(String name,String keyID,String sHomeUrl,String text,Layout_Type type,boolean checked,boolean readOnly) throws ErrorMessage{
		this.name = name;
		this.ID = name+","+keyID;
		this.type = type;
		this.sHomeUrl=sHomeUrl;
		this.text = text;
		this.checked = checked;
		this.readOnly = readOnly;
		this.checkID=this.ID+",rs";//选中
		this.unCheckedID=this.ID+",ru";//不选中
		this._init();
	}

	private void _init() throws ErrorMessage{
		this.mRadio = new HtmlDiv();
		switch(this.type){
		case Horizontal:
			mRadio.setFloat(Float_Type.Left);
			break;
		case Vertical:
			mRadio.setClear(Clear_Type.Left);
		}
		this._createImage();
		this._createText();
	}

	/**
	 * radio图片
	 * @throws ErrorMessage
	 */
	private void _createImage() throws ErrorMessage{
		/**创建DIV*/
		HtmlDiv frame=new HtmlDiv(this.ID+"c","ti");
		
		HtmlDiv check= _getInnerDiv(true);
		HtmlDiv uncheck= _getInnerDiv(false);		
		
		if(this.checked){
			check.setVisibility(Visibility_Mode.Inherit);
			uncheck.setVisibility(Visibility_Mode.Hidden);
		}else{
			check.setVisibility(Visibility_Mode.Hidden);
			uncheck.setVisibility(Visibility_Mode.Inherit);
		}
		/**设置默认选择状态 */
		setDefault();
		if(!this.readOnly){
			/**绑定事件*/
			check.bind(Window_Event.OnClick, this._getBindScript(this.checkID));
			uncheck.bind(Window_Event.OnClick, this._getBindScript(this.unCheckedID));
		}

		/**放入容器*/
		frame.put(check);
		frame.put(uncheck);
		this.mRadio.put(frame);
	}

	/**
	 * radio文本说明
	 * @throws ErrorMessage 
	 */
	private void _createText() throws ErrorMessage{
		HtmlWindow text = new HtmlText(null,"chbt",this.text);
		if(!this.readOnly){
			text.bind(Window_Event.OnClick, this._getBindScriptText());
		}
		this.mRadio.put(text);
	}

	/**
	 * 创建一个用于图片切换的内置Div
	 * @param check 是否是已选择图片,true 是 ,false不是
	 * @return HtmlDiv
	 */
	private HtmlDiv _getInnerDiv(boolean check) throws ErrorMessage{
		String imageUrl = null;
		HtmlDiv mDiv = null;
		if(check){
			mDiv=new HtmlDiv(this.checkID,"tinorm");
			if(this.readOnly){
				imageUrl = this.imgReadOnlyCheck;
			}else{
				imageUrl = this.imgCheck;
			}
		}else{
			mDiv=new HtmlDiv(this.unCheckedID,"tinorm");
			if(this.readOnly){
				imageUrl = this.imgReadOnlyUnCheck;
			}else{
				imageUrl = this.imgUnCheck;
			}
		}
		HtmlImage mImage=new HtmlImage(this.sHomeUrl+imageUrl);
		mDiv.put(mImage);
		return mDiv;
	}

	/**
	 * 绑定脚本
	 * @param thisDivID  要绑定脚本的图片divId(选中或不选中的图片)
	 * @return
	 */
	private String _getBindScript(String thisDivID){
		StringBuilder sb = new StringBuilder();
		sb.append("rad('");
		sb.append(thisDivID);
		sb.append("','");
		sb.append(this.ID);
		sb.append("','");
		sb.append(this.name);
		sb.append("');");
		return sb.toString();
	}
	
	/**
	 * 绑定脚本
	 * @param thisDivID  要绑定脚本的图片divId(选中或不选中的图片)
	 * @return
	 */
	private String _getBindScriptText(){
		StringBuilder sb = new StringBuilder();
		sb.append("radt('");
		sb.append(this.ID);
		sb.append("','");
		sb.append(this.name);
		sb.append("');");
		return sb.toString();
	}

	/**
	 * 设置默认选中
	 * @param check 
	 * @param unCheck
	 * @throws ErrorMessage 
	 */
	private void setDefault() throws ErrorMessage{
		//设置默认选中参数脚本
		if(this.checked){
			this.mRadio.bind(this._getBindScript(this.unCheckedID));
		}
	}
	
	/**
	 * 返回单选框
	 *@return  HtmlDiv
	 */
	public HtmlDiv get(){
		mRadio.setLength(21+TOOLS.getTextLength(this.text));
		return mRadio;
	}

	/**
	 * 获取选项选择上时的页面Id
	 * @return
	 */
	public String getCheckID() {
		return checkID;
	}

	/**
	 * 获取选项未被选择上时的页面ID
	 * @return
	 */
	public String getUnCheckedID() {
		return unCheckedID;
	}
	
	/**
	 * 根据radio的名称和值获取未被选择时的页面ID
	 * @param radioName radio的名称
	 * @param radioValue radio的值
	 * @return
	 */
	public static String getUnCheckedID(String radioName,String radioValue){
		return radioName+","+radioValue+",ru";
	}
	
	/**
	 * 根据radio的名称和值获取被选择时的页面ID
	 * @param radioName radio的名称
	 * @param radioValue radio的值
	 * @return
	 */
	public static String getCheckID(String radioName,String radioValue){
		return radioName+","+radioValue+",rs";
	}
}
